<?php
//рус
abstract class system_collection_class
{
    //protected $objectCollection = array();
    /**
		имя класса объектов в коллекции.
		должно быть задано в наследниках!!!!
     */
    protected $_itemClassName = false;
    protected function __construct ()
    {}
    protected function __get ($name)
    {
        /*
        if (! $this->IsInit($name)) {
            $this->objectCollection[$name] = $this->Get($name);
        }
        return $this->objectCollection[$name];
        */
    	if (!$name) return;
        $this->$name = $this->Get($name);
        return $this->$name;        
    }
    /*
    final protected function __set ($name, $value)
    {
        throw new Exception('Свойства класса только для чтения');
    }
	*/
    final protected function __unset ($name)
    {
        throw new Exception('Свойства класса только для чтения');
    }
    /**
		мэджик метод для функции isset
  		проверяет, возможно ли создать объект для коллекции
     */
    protected function __isset ($name)
    {
        /*
        if ($this->IsInit($name) || $this->IsExists($name))
            return true;
        return false;
		*/
        if ($this->IsExists($name)) return true;
        return false;        
    }
    /**
		проверяет инициализирован ли уже объект в коллекции
     */
    /*
    protected function IsInit ($name)
    {
        if (isset($this->objectCollection[$name]) && ($this->objectCollection[$name] instanceof $this->_itemClassName)) {
            return true;
        }
        return false;
    }
	*/
    /**
		должен возвращать инициализированный объект для коллекции
     */
    abstract public function Get ($name);
    /**
		должен проверять, можно ли создать элемент для коллекции
     */
    abstract public function IsExists ($name);
}